/**
 ******************************************************************************
 * @file           : bsp_rtc.h
 * @brief          : RTC Driver Header File (STM32F4xx)
 ******************************************************************************
 * @attention
 *
 * RTC驱动头文件
 * STM32F4xx日历型RTC
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_RTC_H
#define __BSP_RTC_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "./BSP/RTC/bsp_rtc_config.h"

/* Exported types ------------------------------------------------------------*/

/**
 * @brief RTC错误码枚举
 */
typedef enum
{
    RTC_OK = 0,                 /*!< 成功 */
    RTC_ERROR_PARAM,            /*!< 参数错误 */
    RTC_ERROR_HAL               /*!< HAL库错误 */
} RTC_Error_e;

/**
 * @brief RTC状态枚举
 */
typedef enum
{
    RTC_STATE_IDLE = 0,         /*!< 空闲状态 */
    RTC_STATE_READY,            /*!< 就绪状态 */
    RTC_STATE_BUSY,             /*!< 忙状态 */
    RTC_STATE_ERROR             /*!< 错误状态 */
} RTC_State_e;

/**
 * @brief RTC日期时间结构体
 */
typedef struct
{
    uint16_t year;              /*!< 年(2000-2099) */
    uint8_t month;              /*!< 月(1-12) */
    uint8_t day;                /*!< 日(1-31) */
    uint8_t hour;               /*!< 时(0-23) */
    uint8_t minute;             /*!< 分(0-59) */
    uint8_t second;             /*!< 秒(0-59) */
    uint8_t week;               /*!< 星期(1-7, 1=周一) */
} RTC_DateTime_t;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化 */
void rtc_init(void);
void rtc_deinit(void);

/* 日期时间设置 */
RTC_Error_e rtc_set_datetime(const RTC_DateTime_t *datetime);
RTC_Error_e rtc_set_time(uint8_t hour, uint8_t minute, uint8_t second);
RTC_Error_e rtc_set_date(uint16_t year, uint8_t month, uint8_t day);

/* 日期时间读取 */
void rtc_get_datetime(RTC_DateTime_t *datetime);
void rtc_get_time(uint8_t *hour, uint8_t *minute, uint8_t *second);
void rtc_get_date(uint16_t *year, uint8_t *month, uint8_t *day);

/* 时间戳 */
uint32_t rtc_get_timestamp(void);
void rtc_set_timestamp(uint32_t timestamp);

/* 工具函数 */
uint8_t rtc_get_week(uint16_t year, uint8_t month, uint8_t day);
uint8_t rtc_is_leap_year(uint16_t year);

/* 状态查询函数 */
RTC_State_e rtc_get_state(void);                             /*!< 获取RTC状态 */

/* 调试接口 */
void rtc_print_status(void);                                 /*!< 打印RTC状态 */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_RTC_H */
